package com.mipo.client.javase.log.jdkLogging;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class LogJDKTest2 {
	// 自定义的全局log（个人一般用这个记录）
    private static Logger loclogger = getGlobalLog();
    // Jdk1.7以后自带的全局log（后面我添加了FileHandler，用于写入文件日志）
    private static Logger sysLogger = Logger.getGlobal();
	
	public static void main(String[] args) throws Exception {
		FileHandler fileHandler = new FileHandler("E:/Log/JDKLog/sysLogger.log"); // 为log添加文件输出Handler
		fileHandler.setLevel(Level.INFO);
		fileHandler.setFormatter(new Formatter() {
			@Override
			public String format(LogRecord record) {
				// 设置文件输出格式
                return "[ " + getCurrentDateStr("yyyy-MM-dd HH:mm:ss") + " - Level:" + record.getLevel().getName().substring(0, 1) + " ]-" + "[" + record.getSourceClassName() + " -> " + record.getSourceMethodName() + "()] " + record.getMessage() + "\n";
			}
		});
		// 添加输出文件handler;好像同时控制台也会输出？
		sysLogger.addHandler(fileHandler);
		sysLogger.info("9...");
		sysLogger.info("10...");
		
		loclogger.severe("1...");
		loclogger.warning("2...");
		loclogger.info("3...");
		loclogger.config("4...");
		loclogger.fine("5...");
		loclogger.finer("6...");
		loclogger.finest("7...");
	}
	
	public static Logger getGlobalLog() {
        try {
			Logger LocLogger = Logger.getLogger("Global"); // 获取Log
			LocLogger.setLevel(Level.ALL); // 为log设置全局等级
			addConsoleHandler(LocLogger, Level.INFO); // 添加控制台handler
			addFileHandler(LocLogger, Level.INFO, "E:/Log/JDKLog/locLogger_" + getCurrentDateStr("yyyyMMddHHmmss")+ ".log"); // 添加文件输出handler
			LocLogger.setUseParentHandlers(false); // 设置不适用父类的handlers，这样不会在控制台重复输出信息
			return LocLogger;
		} catch (Exception e) {
			e.printStackTrace();
		}
        return null;
	}
	
	public static void addConsoleHandler(Logger log, Level level) {
        ConsoleHandler consoleHandler = new ConsoleHandler(); // 控制台输出的handler
        consoleHandler.setLevel(level); // 设置控制台输出的等级（如果ConsoleHandler的等级高于或者等于log的level，则按照FileHandler的level输出到控制台，如果低于，则按照Log等级输出）
        log.addHandler(consoleHandler); // 添加控制台的handler
    }
	
	
	public static void addFileHandler(Logger log, Level level, String filePath) throws Exception {
        FileHandler fileHandler = new FileHandler(filePath);
            // 设置输出文件的等级（如果FileHandler的等级高于或者等于log的level，则按照FileHandler的level输出到文件，如果低于，则按照Log等级输出）
            fileHandler.setLevel(level);
            fileHandler.setFormatter(new Formatter() {
                @Override
                public String format(LogRecord record) {
                    // 设置文件输出格式
                    return "[ " + getCurrentDateStr("yyyy-MM-dd HH:mm:ss") + " - Level:" + record.getLevel().getName().substring(0, 1) + " ]-" + "[" + record.getSourceClassName() + " -> " + record.getSourceMethodName() + "()] " + record.getMessage() + "\n";
                }
            });
        // 添加输出文件handler
        log.addHandler(fileHandler);
    }
	
	public static String getCurrentDateStr(String pattern) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }
	
}
